﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.ServiceModel;
using System.Xml.Linq;

namespace EcodexIntegrationSample.Controllers
{
    class frmTimbradoController
    {
        private View.IfrmTimbrado _view;
        private Random _random;

        public frmTimbradoController(View.IfrmTimbrado view)
        {
            _view = view;
            _view.UniTestDummyXMLString += _view_UniTestDummyXMLString;
            _view.GetStatus += _view_GetStatus;
            _view.GetTimbrado += _view_GetTimbrado;
            _view.TimbraXML += _view_TimbraXML;
            _random = new Random();

        }

        void _view_UniTestDummyXMLString(object sender, EventArgs e)
        {

            long transactionID = _random.Next();
            var token = string.Empty;
            string CadenaXML = string.Empty;
            var UUID = "16BF252B-D32E-4651-BBA5-8ED3BF232F2A";

            string Error;
            Utils.Utilerias Util = new Utils.Utilerias();
            Error = Util.CreateToken(Util.RFC, transactionID, ref token);
            if (!string.IsNullOrEmpty(Error))
            {
                _view.ShowUnknownError(Error);
                return;
            }
            try
            {
                transactionID = _random.Next();
                CadenaXML = "<?xml version=\"1.0\" encoding=\"utf-8\"?><cfdi:Comprobante xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:cfdi=\"http://www.sat.gob.mx/cfd/3\" xmlns:ecfd=\"http://www.southconsulting.com/schemas/strict\" xsi:schemaLocation=\"http://www.sat.gob.mx/cfd/3 http://www.sat.gob.mx/sitio_internet/cfd/3/cfdv32.xsd\" version=\"3.2\" fecha=\"2013-08-29T14:13:45\" sello=\"C8Ek8DgaMKe0r0Ohr401azyrYyz+nm7T9LgWGvocPirak2Wwz/GzaOpUZp7pSKpGByEnREYSDbOA+ACvKypKARs9/obI2YJ/BCHN6K8CX+eukpYB5JKC5+ZXeSYeBUfYNwoJTWZhDBmFADhpFVtrJoGQceWqvyi+C1i90ginjdM=\" tipoDeComprobante=\"ingreso\" formaDePago=\"Una Exhibicion Contado\" noCertificado=\"20001000000100005867\" certificado=\"MIIEdDCCA1ygAwIBAgIUMjAwMDEwMDAwMDAxMDAwMDU4NjcwDQYJKoZIhvcNAQEFBQAwggFvMRgwFgYDVQQDDA9BLkMuIGRlIHBydWViYXMxLzAtBgNVBAoMJlNlcnZpY2lvIGRlIEFkbWluaXN0cmFjacOzbiBUcmlidXRhcmlhMTgwNgYDVQQLDC9BZG1pbmlzdHJhY2nDs24gZGUgU2VndXJpZGFkIGRlIGxhIEluZm9ybWFjacOzbjEpMCcGCSqGSIb3DQEJARYaYXNpc25ldEBwcnVlYmFzLnNhdC5nb2IubXgxJjAkBgNVBAkMHUF2LiBIaWRhbGdvIDc3LCBDb2wuIEd1ZXJyZXJvMQ4wDAYDVQQRDAUwNjMwMDELMAkGA1UEBhMCTVgxGTAXBgNVBAgMEERpc3RyaXRvIEZlZGVyYWwxEjAQBgNVBAcMCUNveW9hY8OhbjEVMBMGA1UELRMMU0FUOTcwNzAxTk4zMTIwMAYJKoZIhvcNAQkCDCNSZXNwb25zYWJsZTogSMOpY3RvciBPcm5lbGFzIEFyY2lnYTAeFw0xMjA3MjcxNzAyMDBaFw0xNjA3MjcxNzAyMDBaMIHbMSkwJwYDVQQDEyBBQ0NFTSBTRVJWSUNJT1MgRU1QUkVTQVJJQUxFUyBTQzEpMCcGA1UEKRMgQUNDRU0gU0VSVklDSU9TIEVNUFJFU0FSSUFMRVMgU0MxKTAnBgNVBAoTIEFDQ0VNIFNFUlZJQ0lPUyBFTVBSRVNBUklBTEVTIFNDMSUwIwYDVQQtExxBQUEwMTAxMDFBQUEgLyBIRUdUNzYxMDAzNFMyMR4wHAYDVQQFExUgLyBIRUdUNzYxMDAzTURGUk5OMDkxETAPBgNVBAsTCFVuaWRhZCAxMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC2TTQSPONBOVxpXv9wLYo8jezBrb34i/tLx8jGdtyy27BcesOav2c1NS/Gdv10u9SkWtwdy34uRAVe7H0a3VMRLHAkvp2qMCHaZc4T8k47Jtb9wrOEh/XFS8LgT4y5OQYo6civfXXdlvxWU/gdM/e6I2lg6FGorP8H4GPAJ/qCNwIDAQABox0wGzAMBgNVHRMBAf8EAjAAMAsGA1UdDwQEAwIGwDANBgkqhkiG9w0BAQUFAAOCAQEATxMecTpMbdhSHo6KVUg4QVF4Op2IBhiMaOrtrXBdJgzGotUFcJgdBCMjtTZXSlq1S4DG1jr8p4NzQlzxsdTxaB8nSKJ4KEMgIT7E62xRUj15jI49qFz7f2uMttZLNThipunsN/NF1XtvESMTDwQFvas/Ugig6qwEfSZc0MDxMpKLEkEePmQwtZD+zXFSMVa6hmOu4M+FzGiRXbj4YJXn9Myjd8xbL/c+9UIcrYoZskxDvMxc6/6M3rNNDY3OFhBK+V/sPMzWWGt8S1yjmtPfXgFs1t65AZ2hcTwTAuHrKwDatJ1ZPfa482ZBROAAX1waz7WwXp0gso7sDCm2/yUVww==\" subTotal=\"1.00\" descuento=\"0.00\" total=\"1.00\" metodoDePago=\"Cheque\" TipoCambio=\"1.0000\" Moneda=\"PESOS\" LugarExpedicion=\"San Pauli\" NumCtaPago=\"No Identificado\"><cfdi:Emisor rfc=\"AAA010101AAA\" nombre=\"Emisor Pruebas\"><cfdi:DomicilioFiscal calle=\"San Pauli\" noExterior=\"No. 104\" colonia=\"Loma Verde\" referencia=\"Emisores AC\" municipio=\"San Pauli\" estado=\"San Pauli\" pais=\"MéXICO\" codigoPostal=\"54321\" /><cfdi:RegimenFiscal Regimen=\"Persona Moral en el Regimen General\" /></cfdi:Emisor><cfdi:Receptor rfc=\"CROW100623S70\" nombre=\"Crow Japan\"><cfdi:Domicilio calle=\"Calle Ejemplo\" colonia=\"MADERO\" referencia=\"Telefono.\" localidad=\"CHIHUAHUA\" municipio=\"CHIHUAHUA\" estado=\"CHIHUAHUA\" codigoPostal=\"\" pais=\"Mexico\" /></cfdi:Receptor><cfdi:Conceptos><cfdi:Concepto cantidad=\"1.0000\" unidad=\"Unidades\" noIdentificacion=\"INSPECCION\" descripcion=\"INSPECCION Y VIGILANCIA PARA LA SFP PL\" valorUnitario=\"1.00\" importe=\"1\" /><cfdi:Concepto cantidad=\"10\" unidad=\"No Aplica\" descripcion=\"Ejemplo Descripcion\" valorUnitario=\"10\" importe=\"1000.0000\"><cfdi:InformacionAduanera numero=\"160 \" fecha=\"2013-08-08\" /></cfdi:Concepto><cfdi:Concepto cantidad=\"10\" unidad=\"Pieza\" descripcion=\"Peizas Varias\" valorUnitario=\"150\" importe=\"1500\"><cfdi:Parte cantidad=\"10\" descripcion=\"Ejemplo\"><cfdi:InformacionAduanera numero=\"160\" fecha=\"2012-12-12\" aduana=\"Manzanillo\" /></cfdi:Parte></cfdi:Concepto></cfdi:Conceptos><cfdi:Impuestos totalImpuestosTrasladados=\"0\"><cfdi:Traslados><cfdi:Traslado impuesto=\"IVA\" tasa=\"0.00\" importe=\"0.00\" /></cfdi:Traslados></cfdi:Impuestos></cfdi:Comprobante>";
                #region Timbrado
                var comprobanteXML = new SrvTimbrado.ComprobanteXML { DatosXML = CadenaXML };
                using (var timbradoSrv = new SrvTimbrado.TimbradoClient())
                {
                    var advetencias = timbradoSrv.TimbraXML(ref comprobanteXML, Util.RFC, token, ref transactionID);
                    _view.ResultStr = comprobanteXML.DatosXML;
                }
                #endregion
                #region Optional steep to get the QR barcode image
                transactionID = _random.Next();
                XDocument doc = new XDocument();
                doc = XDocument.Parse(comprobanteXML.DatosXML);
                XElement singature = new XElement("{http://www.sat.gob.mx/TimbreFiscalDigital}TimbreFiscalDigital");
                //string uuid = doc.Root.Descendants(singature.Name).ToArray()[0].Attribute("UUID").Value;
                string uuid = "A19099C5-CFE6-477D-A860-C44BF42B1BE8";
                using (var timbradoSrv = new SrvTimbrado.TimbradoClient())
                {
                    var infoQR = timbradoSrv.ObtenerQRTimbrado(Util.RFC, token, ref transactionID, uuid);
                    using (var ms = new System.IO.MemoryStream(infoQR.Imagen))
                    {
                        _view.BarcodeQR = new System.Drawing.Bitmap(ms);
                        FileStream fs = File.OpenWrite(string.Format(@"C:\{0}.png", UUID));
                        ms.WriteTo(fs);
                        fs.Flush();
                        fs.Close();
                    }

                }
                #endregion
            }
            #region Timbrado service exceptions
            catch (FaultException<SrvTimbrado.FallaServicio> serviceFault)
            {
                using (var errorForm = new Forms.Error(TranslateFault.ToServiceError(serviceFault.Detail)))
                {
                    errorForm.ShowDialog();
                }
            }
            catch (FaultException<SrvTimbrado.FallaSesion> sessionFauld)
            {
                using (var errorForm = new Forms.Error(TranslateFault.ToSessionError(sessionFauld.Detail)))
                {
                    errorForm.ShowDialog();
                }
            }
            catch (FaultException<SrvTimbrado.FallaValidacion> validationFault)
            {
                using (var errorForm = new Forms.Error(TranslateFault.ToValidationError(validationFault.Detail)))
                {
                    errorForm.ShowDialog();
                }
            }
            catch (Exception ex)
            {
                _view.ShowUnknownError(ex.Message);
            }
            #endregion
        }

    
        void _view_GetStatus(object sender, EventArgs e)
        {
            using (var ioForm = new Forms.frmGetStatusTimbrado())
            {
                ioForm.ShowDialog();
            }
        }

        void _view_GetTimbrado(object sender, EventArgs e)
        {
            using (var ioForm = new Forms.frmObtenerTimbrado())
            {
                ioForm.ShowDialog();
            }
        }
        void _view_TimbraXML(object sender, EventArgs e)
        {
            using (var ioForm = new Forms.frmTimbradoXMLFile())
            {
                ioForm.ShowDialog();
            }
        }




    }
}
